home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Leser 15 / Amiga Plus Leser CD 15.iso / Tools / Development / mmu / MuManual / Autodocs / memory.doc < prev    next >
Text File  |  2002-03-12  |  37KB  |  1,145 lines

  1. TABLE OF CONTENTS
  2.  
  3. memory.library/--Background--
  4. memory.library/NewAdrSpaceA
  5. memory.library/DeleteAdrSpace
  6. memory.library/MMUContextOf
  7. memory.library/AdrSpaceOfCtx
  8. memory.library/NewVMPoolA
  9. memory.library/DeleteVMPool
  10. memory.library/LockMemory
  11. memory.library/UnlockMemory
  12. memory.library/HoldMemory
  13. memory.library/UnholdMemory
  14. memory.library/SwapMemoryOut
  15. memory.library/AllocVMemory
  16. memory.library/FreeVMemory
  17. memory.library/PoolVBase
  18. memory.library/PoolVSize
  19. memory.library/EnterAddressSpace
  20. memory.library/LeaveAddressSpace
  21. memory.library/CurrentAddressSpace
  22. memory.library/--Background--            memory.library/--Background--
  23.  
  24.     PURPOSE
  25.     The memory.library provides functions for memory allocation and
  26.     deallocation that are superior to those of the exec.library.
  27.  
  28.     The functions of this library provide so called "virtual memory" by using 
  29.     the mmu.library, memory that can be swapped to disk transparently to the 
  30.     application. Hence, applications will be usually able to allocate more 
  31.     memory than physically available.
  32.  
  33.     Certain access restrictions arise for memory allocated by the memory.library. 
  34.     First, you can't access it in Forbid() or Disable() state. Trying to do so
  35.     may certainly cause a fatal "Guru" of the Bus-Error type. The memory.library
  36.     does further not allow you to allocate or release memory while in Forbid()
  37.     or Disable() state, so beware!
  38.  
  39.     Second, virtual memory cannot be shared amongst different pools. You must 
  40.     explicitly attach the tasks that should be able to access memory from a given 
  41.     pool. Thus, you can't use this kind of memory for keeping Os structures since
  42.     they may be passed to different tasks for further processing. Use the classic
  43.     AllocMem() for this purpose, it will give you "shared memory" or "shareable
  44.     memory".
  45.  
  46.     Third, you MAY NOT access virtual memory in a situation where file I/O would 
  47.     be impossible. That is, DO NOT access this mem while:
  48.         - disabling the filing system of the swap partition if you're using
  49.           a file based swapping mechanism
  50.         - making the swapping exec device unaccessible
  51.         - taking over the hardware
  52.     The mmu.library will try to detect such situations and will throw a guru 
  53.     whenever possible. However, if it is not, these situations will result 
  54.     in a dead-lock! Keep care!
  55.     
  56.  
  57.     OBJECTS:
  58.  
  59.     Two new objects are introduced by the memory library: The "AddressSpace"
  60.     and the "VMPool". Both objects have no documented structure and should
  61.     not be touched by your application directly. Similarly to the MMUContext
  62.     of the mmu.library, these two should be understood as "magic cookies"
  63.     that have to be passed into the functions of the memory.library.
  64.  
  65.     The AddressSpace is an extension of the "MMUContext" of the mmu.library;
  66.     it defines a "meaning" to addresses for all tasks that are part of a
  67.     certain address space. Hence, a "Task" in the exec sense should be 
  68.     understood as a "thread" in the sense of Un*x, and an "AddressSpace" as
  69.     the analogue of a "process" as all tasks that are part of an 
  70.     "AddressSpace" share common addresses. Tasks must enter and leave 
  71.     address spaces explicitly by functions provided by this library.
  72.  
  73.     Each MMUContext can hold *at most one* AddressSpace, not more. In case
  74.     you want to build a new address space, you are hence strongly encouraged
  75.     to build a private MMUContext of the "shared" type, see the mmu.library
  76.     documentation for details. Do not try to attach an address space to the
  77.     public MMUContext.
  78.  
  79.     A VMPool can be understood as the analogue of the memory pools of the
  80.     exec.library. Each AddressSpace can hold as many pools as you need, 
  81.     each of them with a well-defined set of caching modes and memory 
  82.     property flags. You may even define a private swapping mechanism on a
  83.     per-pool basis.
  84.  
  85.     A VMPool need not to carry memory that is available for allocation 
  86.     by means of AllocVMemory() resp. FreeVMemory(). A VMPool can also hold
  87.     the image of a file which is, as a whole, mirrored in memory. The
  88.     file contents can then be altered simply by working on the image in 
  89.     memory, without even requiring to hold the file in memory completely.
  90.     Swapping will happen automatically and completely transparent to your
  91.     application. This is similar to the Un*x mmap() feature.
  92.  
  93.  
  94.     The restriction that virtual memory cannot be accessed during Forbid()
  95.     or Disable() can be weakened somewhat by the LockMemory/UnlockMemory
  96.     resp. HoldMemory/UnholdMemory functions. Where the first pair 
  97.     guarantees that the addressed memory cannot be flushed out and hence
  98.     remains valid within Forbid()/Disable(), the second pair even returns
  99.     a continuous *physical* memory block that can be transfered to and
  100.     from disk using traditional I/O mechanisms. Note that LockMemory()
  101.     does not allow this as a "logical" memory block may be fragmentated
  102.     into several physical memory blocks that do not form a continuous
  103.     memory block by their physical addresses. As both functions require
  104.     the complete memory block to fit into the system main memory, you are
  105.     encouraged to hold locks as short as possible.
  106.  
  107.     This kind of "virtual memory" is of course some kind of a "poor man's 
  108.     solution" for implementing virtual memory. No exec function will be 
  109.     patched and old programs will continue to work without any change. The 
  110.     library is of course of limited or no use at all for old programs since
  111.     it doesn't redirect standard memory allocation functions to their 
  112.     "virtual" counterparts. Thus, this is a very "conservative" approach to
  113.     overcome this limitation of AmigaOs.
  114.  
  115.     A special "VMM/GigaMem" is planned to be made available that uses the 
  116.     functions of this library to provide virtual memory to every task. 
  117.     However, since this CAN'T be fully compatible to old programs and may,
  118.     therefore, cause some compatibility problems. It should be up to the 
  119.     user if she/he likes to install a patch like this or not, but it should 
  120.     NOT the way how virtual memory enters AmigaOs, at least not now.
  121.  
  122. memory.library/NewAdrSpaceA            memory.library/NewAdrSpaceA
  123.  
  124.     NAME
  125.     NewAdrSpaceA    -    create a new address space.
  126.  
  127.     SYNOPSIS
  128.     adr = NewAdrSpaceA( tags );
  129.     d0             a0
  130.  
  131.     struct AdrSpace *NewAdrSpaceA( struct TagItem * );
  132.  
  133.     adr = NewAdrSpace( tag, ... );
  134.  
  135.     struct AdrSpace *NewAdrSpace( Tag tag1, ... );
  136.  
  137.     FUNCTION
  138.     Builds a new address space of the given properties, to be
  139.     passed in as a tag list. Note that this call *does not* attach
  140.     any task to the address space, neither does it involve the
  141.     creation of any memory pool.
  142.  
  143.     INPUTS
  144.     tags -    a tag list containing the arguments how the address
  145.     space has to be build.
  146.  
  147.     RESULTS
  148.     a new address space or NULL on failure. In case this function
  149.     is called from a dos.library "Process", IoErr() will be set to
  150.     a secondary error code on failure. See <memory/memerrors.h>
  151.     for details.
  152.  
  153.     TAGS
  154.     The following tag items are interpreted:
  155.  
  156.  
  157.     MEMTAG_CONTEXT
  158.         The mmu.library MMUContext the address space shall
  159.         become part of. At most one address space per context;
  160.         DO *NOT* attach an address space to the public context
  161.         or to a supervisor context, this won't work.
  162.         Default is the context the MEMTAG_TASK task is part of.
  163.  
  164.     MEMTAG_TASK
  165.         If MEMTAG_CONTEXT is missing, this tag can be used to
  166.         specify the target context. The MMUContext this task
  167.         is part of will then be used as target for the new 
  168.         AddressSpace. Default is the current task.
  169.  
  170.     MEMTAG_SWAPFAILHOOK
  171.         A pointer to a "struct Hook" that will be called 
  172.         whenever swapping memory in or out fails. See the
  173.         "Programmer's manual" for details how you are called.
  174.  
  175.     MEMTAG_VMSIZE
  176.         Size of virtual memory area to be handled by this
  177.         address space, not including shared system memory.
  178.         Default is as large as the system, the swapping
  179.         device and MEMTAG_VMMAXSIZE (see below) allows.
  180.  
  181.     MEMTAG_VMMAXSIZE
  182.         Limits the size of the virtual memory region to be
  183.         allocated to the indicated size. The resulting address
  184.         space will hold at most the indicated size, but might
  185.         hold less due to limitations of the swap device.
  186.         
  187.     MEMTAG_MAXSYSMEM
  188.         Maximal amount of physical system memory this address
  189.         space is allowed to allocate. If a new page must be
  190.         swapped in, the total amount of physical page memory
  191.         held by this address space is compared against this
  192.         threshold. If it is larger, pages are swapped out.
  193.         However, if you hold locks on memory by LockMemory()
  194.         resp. HoldMemory(), the library may ignore this 
  195.         threshold temporarely as long as you hold the locks.
  196.         I.e., locking will not fail due to this threshold as
  197.         long as enough system memory is available.
  198.         Default is half the system memory minus a safety
  199.         margin.
  200.  
  201.     MEMTAG_CACHESIZE
  202.         Defines the size in bytes of an additional write cache
  203.         that is used to minimize the seeking within a swap
  204.         file or swap partition/device. This cache keeps swapped
  205.         out pages and is written out "in one go" as soon as
  206.         necessary. Defaults to sixteen pages, or no write cache
  207.         if MEMTAG_READONLY,TRUE has been found. The memory type
  208.         of the cache is controlled by MEMTAG_BUFMEMTYPE, and
  209.         defaults to MEMF_PUBLIC.
  210.  
  211.     MEMTAG_WINDOWPTRPTR
  212.         Defines a pointer to a window pointer - note the double
  213.         indirection - where error requesters concerning the 
  214.         virtual memory system will appear. If the pointer the
  215.         argument is set to (struct Window *)(~0), no requesters 
  216.         will be generated as if the requester got canceled, 
  217.         if set to NULL, requesters will appear on the workbench. 
  218.         Default is NULL, or a pointer to the pr_WindowPtr 
  219.         component of the MEMTAG_TASK, should this tag be present.
  220.  
  221.     MEMTAG_VMHOOK
  222.         A custom defined swap hook as "struct Hook *" that
  223.         will be called for swapping activities. Either this
  224.         or the next tag must be given to define a swapping
  225.         mechanism.
  226.  
  227.     MEMTAG_VMSWAPTYPE
  228.         Defines a library pre-defined swap hook as swapping
  229.         mechanism; this is the prefered option. The following
  230.         swap types are available:
  231.  
  232.         MEMFLAG_SWAPFILE
  233.             Swap to a dos.library file.
  234.             Note that this is slow for the FFS, but is the
  235.             least critical way to provide a swap target.
  236.  
  237.         MEMFLAG_SWAPPART
  238.             Swap to a dos.library "Device"
  239.             in the sense of a partition on a hard disk. This is
  240.             the best compromise between speed and safety.            
  241.  
  242.         MEMFLAG_DEVICE:        
  243.             Swap to an exec.library 
  244.             "device" given by a device name and a unit.
  245.  
  246.     The following are only for MEMFLAG_SWAPFILE:
  247.  
  248.     MEMTAG_SWAPFILENAME
  249.         A "char *" to the name of the swap file. Must be 
  250.         present for file swapping.
  251.  
  252.     MEMTAG_SWAPFILELOCK
  253.         A lock onto a directory the above file name is
  254.         relative to. Defaults to the current directory of
  255.         the calling process.
  256.  
  257.     MEMTAG_KEEPFILE
  258.         If set to TRUE, the file is not deleted if the
  259.         AddressSpace is shut down. Defaults to FALSE, i.e. 
  260.         the file will be deleted when done.
  261.  
  262.     MEMTAG_PREDEFINED
  263.         If set to TRUE, the swap file is assumed to be
  264.         existent already and the contents of this file
  265.         is mirrored into the virtual memory. Defaults to
  266.         FALSE. Most useful with MEMTAG_KEEPFILE.
  267.  
  268.     MEMTAG_READONLY
  269.         Requires MEMTAG_PREDEFINED set to true and
  270.         allows reading from the swap file only to browse
  271.         it in memory. Any changes made to the memory are
  272.         discarded. Should be combined with the MMU
  273.         property MAPP_ROM or MAPP_READONLY for the pools 
  274.         of this address space for optimal performance.
  275.         Defaults to FALSE.
  276.  
  277.  
  278.     The following are only for MEMFLAG_SWAPPART:
  279.  
  280.     MEMTAG_SWAPDEVICENODE
  281.         A pointer to a dos.library "struct DeviceNode" that
  282.         defines the swap partition. Either this or the next
  283.         tag must be given to specify a swap partition.
  284.  
  285.     MEMTAG_SWAPPARTNAME
  286.         The dos.library device name of the swap partition as
  287.         "char *" with or without trailing colon, e.g. "SWAP:"
  288.  
  289.     The following are only for MEMFLAG_SWAPDEVICE:
  290.         
  291.     MEMTAG_DEVICENAME            
  292.         The name of an exec.library "device" to which memory
  293.         shall be swapped. This must be a "trackdisk"-like
  294.         device that allows random access. This tag must be
  295.         available.
  296.  
  297.     MEMTAG_DEVICEUNIT
  298.         Unit number of the above device to swap to. Defaults
  299.         to zero.
  300.  
  301.     MEMTAG_DEVICEFLAGS
  302.         Flags for "OpenDevice()" for this device. Defaults to
  303.         zero.
  304.  
  305.     MEMTAG_BUFMEMTYPE
  306.         Intermediate buffer memory type for the device in
  307.         case the device is unable to perform I/O on all system
  308.         memory addresses. Default is MEMF_24BITDMA. Note that
  309.         this is a very conservative setting that should work
  310.         with all devices; you might want to specify MEMF_ANY
  311.         here. Note further that the memory.library never
  312.         passes "logical addresses" to the swapping device, but
  313.         always already translated physical addresses.
  314.  
  315.     MEMTAG_MASK
  316.         Memory mask to check the memory against. If the
  317.         output buffer "and-ed" with the complement of this
  318.         mask is non-zero, the device swap hook will use
  319.         single-block I/O to perform the operation. Note that,
  320.         similar to the above, you *need not* to specify a 
  321.         mask to exclude virtual memory. The library will
  322.         always pass physical addresses to the device.
  323.         Default is 0x00fffffc, which is a very conservative
  324.         setting and allows only device access within the
  325.         24 bit address space. A well-written device driver
  326.         will accept 0xffffffff here.
  327.  
  328.     MEMTAG_MAXTRANSFER
  329.         The size of the largest memory block this device
  330.         will be able to access at a time. Defaults to
  331.         0x001fe000. 
  332.  
  333.     MEMTAG_DEVICESIZE
  334.         Size of the area to be reserved for the swapping
  335.         activities. Limited by 2GB. Note that due to the
  336.         broken design of many devices, i.e. lack of support
  337.         for TD_GETGEOMETRY, this size cannot be obtained 
  338.         safely from the device itself.
  339.  
  340.     MEMTAG_DEVICEORIGIN
  341.         Byte offset from the beginning of the device to the
  342.         first block of the device where swapped data will
  343.         be held. This is a pointer to a "QUAD word", i.e.
  344.         a two-ULONG array containing the high and low 
  345.         ulong-word defining the size as 64 bit integer.
  346.         If any part of the swap area exceeds the 64 bit
  347.         limit, the device must be either TD64 or NSD 
  348.         compliant with the further restriction that 
  349.         NSDPatch must be running to activate NSD activities.
  350.     
  351.     MEMTAG_SECTORSIZE
  352.         Size of a sector (or "block") of the device in 
  353.         bytes. This value is only used for single-block
  354.         transfers and defaults to 512 bytes.
  355.  
  356.     NOTES
  357.     This call builds a new address space, but does neither create
  358.     any pools nor does it attach the calling task to the address
  359.     space. You need to do this manually, i.e. build a pool by
  360.     NewVMPool() and enter this address space by EnterAddressSpace().
  361.  
  362.     To mirror the contents of a file into memory (i.e. to emulate
  363.     "mmap") the following tags should be used:
  364.  
  365.  
  366.             adr = NewAdrSpace(
  367.                 MEMTAG_VMSWAPTYPE,MEMFLAG_SWAPFILE,
  368.                 MEMTAG_SWAPFILENAME,"MyMMAPTarget",
  369.                 MEMTAG_KEEPFILE,TRUE,
  370.                 MEMTAG_PREDEFINED,TRUE,
  371.                 TAG_DONE);
  372.  
  373.     For a classical swap partition, the following combination
  374.     is useful:
  375.         
  376.             adr = NewAdrSpace(
  377.                 MEMTAG_VMSWAPTYPE,MEMFLAG_SWAPPART,
  378.                 MEMTAG_SWAPPARTNAME,"SWAP:",
  379.                 MEMTAG_VMSIZE,128*1024*1024, /* e.g. 128MB */
  380.                 TAG_DONE);
  381.  
  382.     Note that - similar to all other Os calls - the tags and its
  383.     arguments must be placed in shared system memory.
  384.  
  385.     BUGS
  386.     The device and partition swap hook expect currently that the block 
  387.     size of the responsible exec.device is a multiple of the page size.
  388.     This rules page sizes of 256 bytes out - as they are available on a 
  389.     68030 or 68020/68851 combo. Further, this doesn't allow swap devices
  390.     whose block sizes are not a power of two (as for example CDs - but
  391.     who wants to swap to a CDRW anyhow?)
  392.  
  393.     SEE ALSO
  394.     DeleteAdrSpace(), mmu/CreateMMUContext(), EnterAddressSpace(),
  395.     dos/IoErr(),
  396.     memory/memtags.h, memory/memerrors.h
  397.  
  398. memory.library/DeleteAdrSpace                    memory.library/DeleteAdrSpace
  399.  
  400.     NAME
  401.     DeleteAdrSpace    -    delete an address space.
  402.  
  403.     SYNOPSIS
  404.     DeleteAdrSpace( adr );
  405.              a0
  406.  
  407.     void DeleteAdrSpace( struct AdrSpace * );
  408.  
  409.     FUNCTION
  410.     This call deletes the specified address space, unlinks it from its
  411.     MMUContext, disposes all VMPools of this address space and closes
  412.     all swap hooks, possibly deleting all swap files.
  413.  
  414.     INPUTS
  415.     adr    -    pointer to the address space to dispose.
  416.  
  417.     RESULTS
  418.     none
  419.  
  420.     NOTES
  421.     You should unlink your task from the MMUContext as well and dispose
  422.     this context as well; this function will *not* do this for you.
  423.     Note that you should not attach AddressSpace(s) to the public MMU
  424.     context.
  425.  
  426.     BUGS
  427.  
  428.     SEE ALSO
  429.     CreateAdrSpaceA(), mmu/DeleteMMUContext()
  430.  
  431. memory.library/MMUContextOf                memory.library/MMUContextOf
  432.  
  433.     NAME
  434.     MMUContextOf    -    return the underlying MMUContext of an
  435.                 AddressSpace
  436.  
  437.     SYNOPSIS
  438.     ctx = MMUContextOf( adrspace );
  439.     d0               a0
  440.  
  441.     struct MMUContext *MMUContextOf( struct AdrSpace *);
  442.  
  443.     INPUTS
  444.     adrspace - pointer to a struct AdrSpace whose underlying MMUContext
  445.     shall be obtained
  446.  
  447.     RESULTS
  448.     ctx - the MMUContext handling the MMU setup of the passed in Address
  449.     space.
  450.  
  451.     NOTES
  452.     This call cannot fail.
  453.  
  454.     BUGS
  455.  
  456.     SEE ALSO
  457.     AdrSpaceOfCtx()
  458. memory.library/AdrSpaceOfCtx            memory.library/AdrSpaceOfCtx
  459.  
  460.     NAME
  461.     AdrSpaceOfCtx    -    return the AdressSpace a MMUContext is
  462.     attached to.
  463.  
  464.     SYNOPSIS
  465.     adr = AdrSpaceOfCtx( ctx );
  466.     d0              a0
  467.  
  468.     struct AdrSpace * AdrSpaceOfCtx( struct MMUContext * );
  469.  
  470.     INPUTS
  471.     ctx - a pointer to a struct MMUContext whose AddressSpace shall be
  472.     obtained.
  473.  
  474.     RESULTS
  475.     the AddressSpace the passed in MMUContext is attached to or NULL
  476.     in case it is not attached to any AddressSpace.
  477.  
  478.     BUGS
  479.  
  480.     SEE ALSO
  481.     MMUContextOf()
  482. memory.library/NewVMPoolA                memory.library/NewVMPoolA
  483.  
  484.     NAME
  485.     NewVMPool    -    create a new virtual memory pool
  486.  
  487.     SYNOPSIS
  488.     pool = NewVMPoolA( tags );
  489.     d0            a0
  490.  
  491.     struct VMPool * NewVMPoolA( struct TagItem *tags);
  492.  
  493.  
  494.     pool = NewVMPool( tag, ... );
  495.  
  496.     struct VMPool * NewVMPool( Tag tag1, ... );
  497.  
  498.     FUNCTION
  499.     Creates a new pool providing virtual memory within an AddressSpace.
  500.  
  501.     INPUTS
  502.     tags - a list of TagItems describing the properties of the VMPool
  503.     to be created, see below.
  504.  
  505.     RESULTS
  506.     a pointer to a new memory pool structure or NULL on failure. If
  507.     the calling task is a dos.library "process", then IoErr() will be
  508.     set to an error code defined in dos/dos.h or memory/memerrors.h 
  509.     on failure.
  510.  
  511.     TAGS
  512.     The following tags are available for building new VMPools:
  513.  
  514.         The next three are used to specify the AddressSpace for
  515.         the new pool:
  516.  
  517.         MEMTAG_ADRSPACE
  518.             A pointer to the AddressSpace within which this
  519.             pool shall be created. 
  520.  
  521.         MEMTAG_CONTEXT
  522.             A pointer to a MMUContext that is attached to
  523.             an AddressSpace; the pool will then be build within
  524.             the AddressSpace that is attached to the specified
  525.             MMUContext.
  526.  
  527.         MEMTAG_TASK
  528.             A pointer to a struct Task that is attached to
  529.             an AddressSpace; the pool will be build within this
  530.             AddressSpace. Defaults to the current task.
  531.  
  532.         If either this or the next tag is present, the pool will
  533.         get its own swapping mechanism; otherwise, the same swap
  534.         hook than the parent AddressSpace will be used:
  535.  
  536.         MEMTAG_VMHOOK
  537.             A custom defined swap hook as "struct Hook *" that
  538.             will be called for swapping activities. 
  539.  
  540.         MEMTAG_VMSWAPTYPE
  541.             Defines a library pre-defined swap hook as swapping
  542.             mechanism.
  543.  
  544.         See NewAdrSpaceA() for further tags related to the swap
  545.         hook specification; all of them are valid here as well.
  546.         Using a private swap hook requires MEMTAG_FIXEDSIZE set
  547.         to TRUE, and therefore MEMTAG_PREDEFINED set to TRUE as
  548.         well.
  549.  
  550.  
  551.         Further extended tags:
  552.  
  553.         MEMTAG_PREALLOC
  554.             If set to TRUE, the pool memory will be allocated
  555.             already at full size from the available virtual 
  556.             memory space of the AddressSpace on setup. Otherwise, 
  557.             memory puddles are build as soon as required. 
  558.             MEMTAG_PREALLOC, TRUE must be specified if you want
  559.             to map a file into memory.
  560.             Defaults to FALSE.
  561.  
  562.         MEMTAG_MEMFLAGS
  563.             exec/memory.h type memory properties describing
  564.             the physical memory to be allocated for this pool.
  565.             Defaults to MEMF_ANY. 
  566.  
  567.         MEMTAG_CACHEFLAGS
  568.             mmu/context.h type "MMU properties" of the memory
  569.             to be addressed by the context. This defaults
  570.             to the optimal caching mode of the memory the
  571.             library allocated for its pages. Useful    flags are:
  572.  
  573.             MAPP_COPYBACK:    Make the memory copyback-cacheable.
  574.                     If cleared explicitly, the caching 
  575.                     mode is writethrough.
  576.             MAPP_CACHEINHIBIT: Forbid caching in the allocated
  577.                     pages.
  578.             MAPP_NONSERIALIZED: Allow access reordering for the
  579.                     68040 if cache inhibited; ignored 
  580.                     otherwise.
  581.             MAPP_IMPRECISE:    Allow imprecise exception model for
  582.                     the 68060 if caching is inhibited; 
  583.                     ignored otherwise.
  584.             MAPP_ROM:    Defensive write protection. Useful
  585.                     for "read only" images of files.
  586.             MAPP_WRITEPROTECTED: Aggressive write protection,
  587.                     write access causes an access error
  588.                     and therefore either a Guru or a
  589.                     MuForce hit.
  590.  
  591.         MEMTAG_CACHEMASK
  592.             mmu/context.h mask describing which caching flags
  593.             shall be altered. Note that the memory.library may
  594.             ignore some of your choices because it requires some
  595.             flags for its own purposes.
  596.  
  597.         MEMTAG_PUDDLESIZE
  598.             Size of a memory puddle in bytes that will be 
  599.             created if a memory block runs out of data. Puddles 
  600.             are enforced to be at least one MMU page large. 
  601.             Defaults to eight pages.
  602.  
  603.         MEMTAG_PUDDLETHRES
  604.             Threshold defining which allocations go into separate
  605.             puddles and which allocations are taken from the
  606.             common puddles. Default is half the puddle size.
  607.             
  608.             NOTE: The puddling mechanism of the memory.library
  609.             works *not* like that of exec.library. Do not
  610.             expect any exec.library compatible memory pools.
  611.  
  612.         MEMTAG_POOLPRI
  613.             Priority of this pool. Higher priority pools will
  614.             be swapped out later. Defaults to zero.
  615.  
  616.         MEMTAG_FIXEDSIZE
  617.             Do not allow the creation of new puddles. Only use-
  618.             ful if MEMTAG_PREALLOC is set to TRUE as well or
  619.             you won't be able to allocate any memory. Defaults
  620.             to FALSE.
  621.  
  622.         MEMTAG_PROVIDESMEM
  623.             Set to TRUE in case this pool can be used to allocate
  624.             virtual memory; if FALSE, this pool is rather used
  625.             as a mirror of the swap space, or available for your
  626.             own memory allocation routines. Defaults to TRUE,
  627.             should be set to FALSE for an "mmap" emulation.
  628.  
  629.         MEMTAG_PREDEFINED
  630.             The pool contents is pre-defined by the contents of
  631.             the swap space. Only useful if you want to mirror the 
  632.             swap space into memory for "mmap" emulation.
  633.             Defaults to FALSE.
  634.  
  635.         MEMTAG_READONLY
  636.             Changes made to the pool are not written back to
  637.             swap space. Requires MEMTAG_PROVIDESMEM set to FALSE
  638.             or the pool will become corrupt as soon as it must
  639.             be swapped. Defaults to FALSE.
  640.  
  641.     NOTES
  642.     Useful pool options for "mmap" are as follows:
  643.  
  644.     
  645.         vmpool = NewVMPool(    MEMTAG_ADRSPACE,adr,
  646.                     MEMTAG_PREDEFINED,TRUE,
  647.                     /* MEMTAG_READONLY,TRUE, for read-only files */
  648.                     MEMTAG_PREALLOC,TRUE,
  649.                     MEMTAG_PROVIDESMEM,FALSE,
  650.                     MEMTAG_FIXEDSIZE,TRUE,
  651.                     TAG_DONE);
  652.  
  653.     Then use PoolVBase() to obtain the virtual base address of the swap
  654.     file in memory.
  655.  
  656.     Useful options for virtual memory operations are:
  657.  
  658.         
  659.         vmpool = NewVMPool(    MEMTAG_ADRSPACE,adr,
  660.                     MEMTAG_PROVIDESMEM,TRUE,
  661.                     /* MEMTAG_MEMFLAGS,MEMF_CLEAR, */
  662.                     TAG_DONE);
  663.  
  664.     Then use AllocVMemory() and FreeVMemory() to allocate and release 
  665.     virtual memory. Note that MEMF_CLEAR might be very expensive since
  666.     clearing the memory might cause the library swap in/out the blanked
  667.     memory.
  668.  
  669.    SEE ALSO
  670.     NewAdrSpaceA(), PoolVBase(), AllocVMemory(), FreeVMemory(),
  671.     dos/IoErr(),
  672.     memory/memerrors.h, memory/memtags.h
  673. memory.library/DeleteVMPool                memory.library/DeleteVMPool
  674.  
  675.     NAME
  676.     DeleteVMPool - Delete a virtual memory pool
  677.  
  678.     SYNOPSIS
  679.     DeleteVMPool( pool );
  680.                a0
  681.  
  682.     void DeleteVMPool( struct VMPool *);
  683.  
  684.     FUNCTION
  685.     Deletes the given virtual memory pool, releases the memory occupied 
  686.     by the pool.
  687.  
  688.     INPUTS
  689.     pool a handle to a VMPool as created by NewVMPoolA(). 
  690.  
  691.     RESULTS
  692.     nothing
  693.  
  694.     NOTES
  695.     In case the pool was created with MEMTAG_PREDEFINED,TRUE, this
  696.     call also ensures that all changes to the memory are again swapped
  697.     out before the swap hook is closed again. 
  698.  
  699.     SEE ALSO
  700.     NewVMPoolA()
  701. memory.library/LockMemory               memory.library/LockMemory
  702.  
  703.     NAME
  704.     LockMemory - lock virtual memory in physical space
  705.  
  706.     SYNOPSIS
  707.     ok = LockMemory( adr, mem, size );
  708.     d0         a0   a1   d0
  709.  
  710.     BOOL LockMemory( struct AdrSpace *,APTR,size);
  711.  
  712.     FUNCTION
  713.     The specified memory region in the selected address space is swapped
  714.     in and locked in physical memory. It will not be swapped out until
  715.     you unlock it again. This call nests.
  716.  
  717.     INPUTS
  718.     adr - the address space the memory is part of. Need not to be the
  719.     address space of the calling task.
  720.     mem - (virtual) start address of the memory to lock.
  721.     size - size of the virtual memory to lock.
  722.  
  723.     mem and size will be rounded down resp. up to multiples of the 
  724.     page size.
  725.  
  726.     RESULTS
  727.     a boolean success/failure indicator. This call may fail if not
  728.     enough physical memory is available to hold the entire range.
  729.  
  730.     NOTES
  731.     Even though the memory region will be represented in physical
  732.     space after you locked it, it need not to be represented as a
  733.     single continuous block. It is likely that it is fragmented
  734.     into several discontinuous blocks. Therefore, this routine does
  735.     not return any physical address. Use HoldMemory() for that.
  736.  
  737.     Note that this call nests.
  738.  
  739.     BUGS
  740.  
  741.     SEE ALSO
  742.     UnlockMemory(), HoldMemory()
  743. memory.library/UnlockMemory               memory.library/UnlockMemory
  744.  
  745.     NAME
  746.     UnlockMemory - unlock virtual memory and re-allow swapping
  747.  
  748.     SYNOPSIS
  749.     UnlockMemory( adr, mem, size, force);
  750.               a0   a1    d0    d1
  751.  
  752.     void UnlockMemory(struct AdrSpace *,APTR,ULONG size,BOOL force);
  753.  
  754.     FUNCTION
  755.     The specified memory region of the address space is unlocked again.
  756.     If the last lock is unlocked again, swapping the memory region
  757.     is re-allowed. The memory region passed in here should match one
  758.     of the regions previously locked with LockMemory().
  759.  
  760.     INPUTS
  761.     adr - Address space whose memory shall be unlocked.
  762.     mem - (virtual) start address of the memory to be unlocked.
  763.     size - size of the memory region to unlock
  764.     force - if FALSE, this call nests with a previous LockMemory().
  765.         if TRUE, this call resets all lock counts immediately.
  766.  
  767.     mem and size will be rounded down resp. up to multiples of the 
  768.     page size.
  769.  
  770.     RESULTS
  771.     nothing
  772.  
  773.     NOTES
  774.     Uses "force = TRUE" with care. It ignores the nesting and
  775.     hence the design of LockMemory().
  776.  
  777.     BUGS
  778.  
  779.     SEE ALSO
  780.     LockMemory(), UnholdMemory()
  781. memory.library/HoldMemory            memory.library/HoldMemory
  782.  
  783.     NAME
  784.     HoldMemory - hold and lock memory in a continuous physical block
  785.  
  786.     SYNOPSIS
  787.     physical = HoldMemory( adr, mem, size );
  788.     d0            a0   a1   d0
  789.  
  790.     APTR HoldMemory( struct AdrSpace *,APTR,size);
  791.  
  792.     FUNCTION
  793.     The specified memory region in the selected address space is swapped
  794.     in and locked in a continuous block of physical memory. It will not be 
  795.     swapped out until you unhold it again. This call nests.
  796.  
  797.     INPUTS
  798.     adr - the address space the memory is part of. Need not to be the
  799.     address space of the calling task.
  800.     mem - (virtual) start address of the memory to lock.
  801.     size - size of the virtual memory to lock.
  802.  
  803.     mem and size will be rounded down resp. up to multiples of the 
  804.     page size.
  805.  
  806.     RESULTS
  807.     the physical address of the memory block containing the memory region
  808.     or NULL in case the physical memory is not available.
  809.  
  810.     NOTES
  811.     This call guarantees that the specified memory region is held 
  812.     entirely and continuously in physical memory. Note that this is
  813.     a relatively "costy" operation and might require moving major
  814.     parts of data around. Hence, try to avoid this call and use
  815.     LockMemory() whenever applicable.
  816.  
  817.     Note that this call nests.
  818.  
  819.     BUGS
  820.  
  821.     SEE ALSO
  822.     UnholdMemory(), LockMemory()
  823. memory.library/UnholdMemory               memory.library/UnholdMemory
  824.  
  825.     NAME
  826.     UnholdMemory - unlock virtual memory and re-allow swapping
  827.  
  828.     SYNOPSIS
  829.     UnholdMemory( adr, mem, size, force);
  830.               a0   a1    d0    d1
  831.  
  832.     void UnholdMemory(struct AdrSpace *,APTR,ULONG size,BOOL force);
  833.  
  834.     FUNCTION
  835.     The specified memory region of the address space is unlocked again.
  836.     If the last lock is unlocked again, swapping the memory region
  837.     is re-allowed. The memory region passed in here should match one
  838.     of the regions previously locked with HoldMemory().
  839.  
  840.     INPUTS
  841.     adr - Address space whose memory shall be unlocked.
  842.     mem - (virtual) start address of the memory to be unlocked.
  843.     size - size of the memory region to unlock
  844.     force - if FALSE, this call nests with a previous HoldMemory().
  845.         if TRUE, this call resets all lock counts immediately.
  846.  
  847.     mem and size will be rounded down resp. up to multiples of the 
  848.     page size.
  849.  
  850.     RESULTS
  851.     nothing
  852.  
  853.     NOTES
  854.     Uses "force = TRUE" with care. It ignores the nesting and
  855.     hence the design of HoldMemory().
  856.  
  857.     BUGS
  858.  
  859.     SEE ALSO
  860.     HoldMemory(), UnlockMemory()
  861. memory.library/SwapMemoryOut            memory.library/SwapMemoryOut
  862.  
  863.     NAME
  864.  
  865.     SwapMemoryOut    -    swap a virtual memory block out.
  866.  
  867.     SYNOPSIS
  868.  
  869.     ok = SwapMemoryOut( adr, mem, size );
  870.     d0            a0   a1   d0
  871.  
  872.     BOOL SwapMemoryOut( struct AdrSpace, APTR mem, ULONG size);
  873.  
  874.     FUNCTION
  875.     swaps the selected memory region of the specified address space
  876.     out to the swap device. The locked or held parts of the selected
  877.     memory blocks remain in memory, though.
  878.  
  879.     INPUTS
  880.     adr - address space whose memory shall be swapped out
  881.     mem - (logical) base address of the memory area to swap out
  882.     size - size in bytes of the memory region to swap out
  883.  
  884.     mem and size will be rounded down resp. up to multiples of the 
  885.     page size.
  886.  
  887.     RESULTS
  888.     a boolean success/failure indicator. On FALSE, your SwapFault
  889.     hook will have been called already.
  890.  
  891.     NOTES
  892.     This call swaps memory out on demand. This might be a good thing
  893.     to do for telling the library that certain memory regions are
  894.     currently not required. This call does *not* override any locks
  895.     or helds of the regions involved; if parts of the selected
  896.     memory block is locked or held, these parts, and only these
  897.     parts, remain untouched.
  898.  
  899.     BUGS
  900.  
  901.     SEE ALSO
  902.     LockMemory(), HoldMemory()
  903. memory.library/AllocVMemory            memory.library/AllocVMemory
  904.  
  905.     NAME
  906.  
  907.     AllocVMemory    -    allocate virtual memory from a pool
  908.  
  909.  
  910.     SYNOPSIS
  911.     mem = AllocVMemory( pool, bytesize);
  912.     d0             a0         d0
  913.  
  914.     APTR AllocVMemory( struct VMPool *, ULONG);
  915.  
  916.     FUNCTION
  917.     This function allocates memory from a given virtual pool.
  918.  
  919.     INPUTS
  920.     pool - The pool to allocate the memory from.
  921.  
  922.     bytesize - The size of the memory required. This might be larger
  923.     than the amount of physical memory available.
  924.  
  925.     RESULTS
  926.     the memory block allocated or NULL for failure. If the calling
  927.     task is a process, the reason for failure will be returned by
  928.     IoErr().
  929.  
  930.     NOTES
  931.     This call may cause task reschelduringe. It may swap out pages of
  932.     virtual memory if necessary. This call will fail(!) if you call
  933.     it within a Forbid() or Disable() state.
  934.  
  935.     The returned memory will be aligned to at least a longword bondary,
  936.     the size might be rounded somewhat, but will at least contain the 
  937.     number of bytes specified by the argument.
  938.  
  939.     To be able to allocate memory from the pool, the calling task
  940.     must have been entered the AddressSpace of the selected pool. See
  941.     EnterAddressSpace().
  942.  
  943.     BUGS
  944.  
  945.     SEE ALSO
  946.     FreeVMemory(), EnterAddressSpace(), dos/IoErr(),
  947.     exec/memory.h, memory/memerrors.h
  948. memory.library/FreeVMemory            memory.library/FreeVMemory
  949.  
  950.     NAME
  951.     FreeVMemory - release virtual memory
  952.  
  953.     SYNOPSIS
  954.     FreeVMemory( pool , mem , bytesize);
  955.               a0     a1         d0
  956.  
  957.     void FreeVMemory( struct VMPool *, APTR mem, ULONG size);
  958.  
  959.     FUNCTION
  960.     This function releases virtual memory back into the pool.
  961.  
  962.     INPUTS
  963.     pool -    the pool the memory was taken from. Must match the pool of
  964.         AllocVMemory()
  965.  
  966.     mem  -    the memory pointer to be released. It is safe to pass NULL
  967.         here. No action is performed then.
  968.  
  969.     bytesize - size of the memory block to release. *MUST* match the
  970.            size parameter of AllocVMemory.
  971.  
  972.     RESULTS
  973.     none
  974.  
  975.     NOTES
  976.     The caller *MUST NOT* be in Forbid() or Disable() state. If this
  977.     rule is not followed, a bus error "Guru 80000002" or a MuForce
  978.     hit might be the result. This call might swap virtual memory pages 
  979.     in or out.
  980.  
  981.     To be able to call this function, the calling task must have entered
  982.     the AddressSpace the pool is part of. See EnterAddressSpace() for
  983.     details.
  984.  
  985.     SEE ALSO
  986.     AllocVMemory(), EnterMMUContext()
  987. memory.library/PoolVBase            memory.library/PoolVBase
  988.  
  989.     NAME
  990.     PoolVBase - return the logical base address of a memory pool
  991.  
  992.     SYNOPSIS
  993.     mem = PoolVBase( pool );
  994.     d0          a0
  995.  
  996.     APTR PoolVBase ( struct VMPool *);
  997.  
  998.     FUNCTION
  999.     This function returns the base address of the virtual memory block
  1000.     the memory pool consists of. However, this call is guaranteed to
  1001.     work *ONLY* if the pool has been setup with the tags
  1002.  
  1003.     MEMTAG_PROVIDESMEM,FALSE,
  1004.     MEMTAG_PREDEFINED,TRUE,
  1005.  
  1006.     to declare a non-administrated pool.
  1007.  
  1008.     INPUTS
  1009.     pool - pointer to a VMPool structure as obtained from NewVMPoolA().
  1010.  
  1011.     RESULTS
  1012.     a pointer to the first logical address managed by the pool or NULL
  1013.     in case of failure.
  1014.  
  1015.     NOTES
  1016.     This call will fail if the pool has been setup for usage of the
  1017.     virtual memory allocation pair AllocVMemory() resp. FreeVMemory().
  1018.     Use this pair of functions to obtain logical addresses then.
  1019.  
  1020.     The purpose of this call is either to implement a private memory
  1021.     management within the pool memory, or to get the base address of a
  1022.     mirror image of a file if you use this pool as "mmap" emulation.
  1023.  
  1024.     BUGS
  1025.  
  1026.     SEE ALSO
  1027.     PoolVSize(), NewVMPoolA(), AllocVMemory(), FreeVMemory()
  1028. memory.library/PoolVSize            memory.library/PoolVSize
  1029.  
  1030.     NAME
  1031.     PoolVSize - get the size of a virtual memory pool
  1032.  
  1033.     SYNOPSIS
  1034.     size = PoolVSize( pool );
  1035.     d0           a0
  1036.  
  1037.     ULONG PoolVSize( struct VMPool * );
  1038.  
  1039.     FUNCTION
  1040.     Returns the size in bytes of the passed in memory pool. Hence, the
  1041.     pool covers the virtual addresses from PoolVBase(..) up to
  1042.     PoolVBase(..) + PoolVSize(..), exclusive. However, this call is 
  1043.     guaranteed to work *ONLY* if the pool has been setup with the tags
  1044.  
  1045.     MEMTAG_PROVIDESMEM,FALSE,
  1046.     MEMTAG_PREDEFINED,TRUE
  1047.  
  1048.     to declare a non-administrated pool.
  1049.  
  1050.     INPUTS
  1051.     pool -    a handle to the virtual memory pool whose size shall be
  1052.         obtained.
  1053.  
  1054.     RESULTS
  1055.     the pool size in bytes, or 0 in case of failure.
  1056.  
  1057.     NOTES
  1058.     This call will fail if the pool has been setup for usage of the
  1059.     virtual memory allocation pair AllocVMemory() resp. FreeVMemory().
  1060.  
  1061.     The purpose of this call is either to implement a private memory
  1062.     management within the pool memory, or to get the size of a mirror
  1063.     image of a file if you use this pool as "mmap" emulation. 
  1064.  
  1065.     Note that in the latter case, the size of the pool might be larger
  1066.     than the file size due to the MMU page granularity. In fact, pool
  1067.     sizes will always be multiples of the MMU page size, whatever it
  1068.     might be.
  1069.  
  1070.     BUGS
  1071.  
  1072.     SEE ALSO
  1073.     PoolVBase(), NewVMPoolA(), AllocVMemory(), FreeVMemory()
  1074. memory.library/EnterAddressSpace         memory.library/EnterAddressSpace
  1075.  
  1076.     NAME
  1077.     EnterAddressSpace - attach a task to an address space
  1078.  
  1079.  
  1080.     SYNOPSIS
  1081.     ok = EnterAddressSpace( adr , task );
  1082.     d0            a0    a1
  1083.  
  1084.     BOOL EnterAddressSpace(struct AdrSpace *adr,struct Task *task);  
  1085.  
  1086.     FUNCTION
  1087.     This call makes the specified task enter the address space; If this
  1088.     call succeeds, the task may use all the VMPools of the address-
  1089.     space.
  1090.  
  1091.     INPUTS
  1092.     adr -     address space to enter
  1093.     task -    task that is supposed to enter an address space
  1094.  
  1095.     RESULTS
  1096.     a boolean success/failure indicator. Will be TRUE on success,
  1097.     FALSE otherwise.
  1098.  
  1099.     NOTES
  1100.     Note that you *must* enter address spaces explicitly to use their
  1101.     VMPools. NewAdrSpaceA() won't do this for you.
  1102.  
  1103.     This call also (implicitly) enters the MMUContext of the AddressSpace
  1104.     and hence overloads the tc_Switch and tc_Launch vectors of the
  1105.     specified task.
  1106.  
  1107.     BUGS
  1108.         
  1109.     SEE ALSO
  1110.     LeaveAddressSpace()
  1111. memory.library/LeaveAddressSpace        memory.library/LeaveAddressSpace
  1112.  
  1113.     NAME
  1114.     LeaveAddressSpace - remove the calling task from an address space.
  1115.  
  1116.     SYNOPSIS
  1117.  
  1118.     ok = LeaveAddressSpace( task );
  1119.     d0             a1
  1120.  
  1121.     BOOL LeaveAddressSpace( struct Task *);
  1122.  
  1123.     FUNCTION
  1124.     Remove the calling task from its address space and let it enter    the 
  1125.     public MMUContext again. The address space itself will continue    to
  1126.     exist.
  1127.  
  1128.     INPUTS
  1129.     task - pointer to the task that shall leave its address space
  1130.  
  1131.     RESULTS
  1132.     a boolean success/failure indicator. Will return FALSE for
  1133.     incorrect parameters, but is otherwise not fail-able.
  1134.  
  1135.     NOTES
  1136.     The current task is, after calling this function, no longer allowed
  1137.     to use any virtual memory allocated by the memory.library.
  1138.  
  1139.     It is safe to call this function if the current task isn't attached
  1140.     to any address space. Nothing will happen in this case except a
  1141.     FALSE result code.
  1142.  
  1143.     SEE ALSO
  1144.     EnterAddressSpace()
  1145.